Índice

Trabajo Práctico N°1

Introducción

En el contexto de la actual pandemia de COVID-19 muchos ideales de la planificación urbana se han puesto en duda. Uno de ellos, y quizás el más evidente, tiene que ver con los patrones de uso del suelo de los centros de las grandes ciudades.

Pesando en una posible revitalización urbana y en la incoporación de áreas verdes en zonas densas y consolidadas, nos preguntamos:

¿Es posible convertir los estacionamientos concesionados en áreas verdes? 
¿Dónde se ubican? ¿Están espacialmente concentrados en el centro?

Consignas

  1. Elegir una ciudad de cualquier parte del mundo que les interese (ya que seguirán trabajando con ella a lo largo del curso) y que disponga de un portal de datos abiertos que ofrezca un shapefile (formato geojson o shp) de polígonos con alguna división geográfica: barrios, comunas, etc.

En este trabajo elegiremos a la Ciudad Autónoma de Buenos Aires (CABA) como objeto de estudio.

Nuestro primer paso será cargar los datasets espaciales que incluyen los barrios y las manzanas de la ciudad.

barrios <- st_read ("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/barrios.geojson")
## Reading layer `barrios_badata' from data source `https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/barrios.geojson' using driver `GeoJSON'
## Simple feature collection with 48 features and 4 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## Geodetic CRS:  WGS 84
manzanas <- st_read ("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/manzanas.geojson")
## Reading layer `manzanas' from data source `https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/manzanas.geojson' using driver `GeoJSON'
## Simple feature collection with 12520 features and 12 fields
## Geometry type: POLYGON
## Dimension:     XYZ
## Bounding box:  xmin: -58.53042 ymin: -34.70389 xmax: -58.33514 ymax: -34.52755
## z_range:       zmin: 0 zmax: 49.894
## Geodetic CRS:  WGS 84
  1. Del mismo portal de datos donde descargaron el shapefile, o de otra fuente si la tienen, elegir un dataset con registros geo-referenciados. Por ejemplo, las escuelas de la ciudad (o las comisarías, o las propiedades en alquiler, etc) con sus coordenadas. Puede ser en formato csv o shapefile.

La pandemia generó grandes transformaciones en las formas de habitar nuestras ciudades. En esta linea, a partir de los cambios en los patrones de movilidad, grandes espacios de la trama urbana dedicados al transporte, como los estacionamientos, quedaron en desuso, provocando así grandes vacíos urbanos, particularmente, en las zonas céntricas. De igual manera, la coyuntura puso en evidencia la falta de espacios verdes existente en la CABA.

Con el fin de construir una solución que permita reconvertir aquellas superficies obsoletas en espacios verdes y así mejorar la calidad de vida de las personas, en este trabajo analizaremos territorialmente la distribución de los estacionamientos urbanos.

A continuación abriremos los datasets de estacionamientos y de espacios verdes.

estacionamientos <- read.csv("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/estacionamientos.csv",
                             stringsAsFactors = TRUE,
                             encoding = "UTF-8")
espacioverde <- st_read("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/espacioverdepublico.geojson")
## Reading layer `espacio_verde_publico_WGS84' from data source `https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/espacioverdepublico.geojson' using driver `GeoJSON'
## Simple feature collection with 1731 features and 31 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -58.53175 ymin: -34.70557 xmax: -58.33983 ymax: -34.52657
## Geodetic CRS:  WGS 84
  1. Realizar un “join espacial”, asignando a cada registro geo-referenciado la unidad geográfica (barrio, comuna, etc) que le corresponda y utilizar ggplot() para realizar lo siguiente:

Inspeccionamos nuestro dataset principal:

head(estacionamientos)
##        long       lat id                          nombre
## 1 -58.38934 -34.58391  1             FACULTAD DE DERECHO
## 2 -58.38222 -34.59424  2 9 DE JULIO e/ Santa Fe y Juncal
## 3 -58.38153 -34.60497  3                  OBELISCO NORTE
## 4 -58.38170 -34.60256  4            9 DE JULIO Y LAVALLE
## 5 -58.38105 -34.61424  5 9 DE JULIO e/ Belgrano y México
## 6 -58.37683 -34.59881  6                         CÓRDOBA
##                          tipo                         direccion_ calle_nombre
## 1                                            Facultad de Derecho             
## 2 Estacionamiento Subterráneo 9 de Julio entre Santa Fe y Juncal             
## 3 Estacionamiento Subterráneo         9 DE JULIO AV. y SARMIENTO             
## 4 Estacionamiento Subterráneo           9 DE JULIO AV. y LAVALLE             
## 5 Estacionamiento Subterráneo 9 de Julio entre Belgrano y México             
## 6 Estacionamiento Subterráneo  Córdoba entre Florida y Esmeralda             
##   calle_altura                         calle_cruce      barrio   comuna
## 1           NA                                                         
## 2           NA  9 de Julio entre Santa Fe y Juncal                     
## 3           NA          9 DE JULIO AV. y SARMIENTO San Nicolas Comuna 1
## 4           NA            9 DE JULIO AV. y LAVALLE San Nicolas Comuna 1
## 5           NA  9 de Julio entre Belgrano y México                     
## 6           NA   Córdoba entre Florida y Esmeralda                     
##   codigo_postal codigo_postal_argentino
## 1            NA                        
## 2            NA                        
## 3            NA                        
## 4            NA                        
## 5            NA                        
## 6            NA
nrow(estacionamientos)
## [1] 49

Hay 49 estacionamientos concesionados, de acuerdo a los datos del GCBA. Como existen missing values en las columnas de barrio y comuna, procederemos a eliminar dichas columnas y refernciar la información de manera espacial. Sólo nos quedaremos con las columnas que nos interesan para el análisis.

estacionamientos <- estacionamientos %>% 
  #seleccionamos las columnas
  select(long, lat, id, nombre, tipo) %>% 
  #renombramos la columna de longitud, por comodidad
  rename(lon=long) %>% 
  #levantamos el csv espacialmente, tomando los valores de longitud y latitud
  st_as_sf(coords = c("lon", "lat"), crs = 4326)

¿Cuántos estacionamientos concesionados hay por barrio?

Para saber cuántos estacionamientos concesionados hay por barrio, primero haremos una unión espacial de nuestros datasets.

#primero nos aseguramos que ambos datasets se encuentren en el mismo sistema de coordenadas.
barrios <- st_transform(barrios, crs=st_crs(estacionamientos))
estacionamientos <- st_join (estacionamientos, barrios)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
head(estacionamientos)
## Simple feature collection with 6 features and 7 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -58.38934 ymin: -34.61424 xmax: -58.37683 ymax: -34.58391
## Geodetic CRS:  WGS 84
##   id                          nombre                        tipo      barrio
## 1  1             FACULTAD DE DERECHO                                RECOLETA
## 2  2 9 DE JULIO e/ Santa Fe y Juncal Estacionamiento Subterráneo      RETIRO
## 3  3                  OBELISCO NORTE Estacionamiento Subterráneo SAN NICOLAS
## 4  4            9 DE JULIO Y LAVALLE Estacionamiento Subterráneo SAN NICOLAS
## 5  5 9 DE JULIO e/ Belgrano y México Estacionamiento Subterráneo   MONSERRAT
## 6  6                         CÓRDOBA Estacionamiento Subterráneo SAN NICOLAS
##   comuna perimetro    area                    geometry
## 1      2 21452.839 6317265 POINT (-58.38934 -34.58391)
## 2      1 18837.989 4512711 POINT (-58.38222 -34.59424)
## 3      1  6548.085 2289008 POINT (-58.38153 -34.60497)
## 4      1  6548.085 2289008  POINT (-58.3817 -34.60256)
## 5      1  6739.222 2198622 POINT (-58.38105 -34.61424)
## 6      1  6548.085 2289008 POINT (-58.37683 -34.59881)

Vemos que se le agregaron las columnas correspondientes a los datos de barrios (barrio, comuna, perímetro, área y geometry)

Paso siguiente, lo agruparemos por barrio y resumiremos por cantidad de estacionamiento. Luego, lo convertiremos en data.frame y eliminaremos la geometría.

estacionamientos_barrio <- estacionamientos %>% 
  group_by(barrio) %>% 
  summarise(cantidad=(n())) %>% 
  st_set_geometry(NULL) %>% 
  as.data.frame()
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
head(estacionamientos_barrio)
##          barrio cantidad
## 1     BALVANERA        7
## 2      BELGRANO        1
## 3     CHACARITA        1
## 4     MONSERRAT        5
## 5       PALERMO        6
## 6 PUERTO MADERO        5

Logramos crear una tabla de datos donde sólo tenemos los nombres de los barrios y la cantidad de estacionamientos concesionados en cada uno de ellos.

Como paso siguiente, uniremos nuevamente nuestro dataset a los datos espaciales de barrios para recuperar la geometría.

estacionamientos_barrio <- left_join(barrios, estacionamientos_barrio, by="barrio")

Visualizamos

ggplot()+
  geom_bar(data=estacionamientos_barrio %>% filter(cantidad!=0), aes(y=reorder(barrio, -cantidad), weight=cantidad, fill=barrio), show.legend = FALSE)+
  scale_fill_viridis_d()+
  labs(x="Cantidad de estacionamientos concesionados", 
       y="Barrio",
       title="¿Cuáles son los barrios con más estacionamientos en la Ciudad?", 
       caption="Fuente: GCBA")+
  scale_x_continuous(breaks = seq(0, 12, 1))+
  theme_minimal()

Mapeamos

ggplot()+
  geom_sf(data=barrios, fill="white")+
  geom_sf(data=estacionamientos_barrio %>% filter(cantidad!=0), aes(fill=cantidad), alpha=.5, show.legend = FALSE)+
  geom_sf_text(data=estacionamientos_barrio, aes(label=cantidad), size=4, fontface = "bold")+
  scale_fill_viridis_c()+
  labs(title="¿Cuántos estacionamientos concesionados hay por barrio?",
              caption="Fuente: GCBA")+
  theme_void()+
  theme(plot.title = element_text( hjust = 0.5))
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning: Removed 39 rows containing missing values (geom_text).

En este primer análisis observamos que el área central de la ciudad concentra casi la mitad de los estacionamientos concesionados de la CABA. A continuación, analizaremos esta cuestión con mayor profundidad.

Nuestro primer paso será geolocalizar las manzanas de la Ciudad. Como estas no cuentan con información del barrio en el que se ubican, procederemos a unir los datasets.

manzanas <- st_join(manzanas, barrios)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar

Luego, nos quedaremos con las manzanas pertenecientes a los barrios del microcentro porteño (Balvanera, Monserrat y San Nicolas).

microcentro <- filter(manzanas, barrio=="MONSERRAT" | barrio=="BALVANERA" | barrio=="SAN NICOLAS")

Utilizaremos este último dataset para filtrar los estacionamientos y espacios verdes de la CABA.

estacionamientos <- st_intersection(estacionamientos, microcentro)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
espacioverde <- st_intersection(espacioverde, microcentro)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Y nos quedamos solo con aquellos estacionamientos que sean al nivel de la vereda.

estacionamientos<- filter(estacionamientos, tipo!="Estacionamiento Subterráneo")

Graficamos

ggplot()+
  geom_sf(data = microcentro, fill="grey96")+
  geom_sf(data = espacioverde, fill="springgreen2")+
  geom_sf(data = estacionamientos, aes(color="Estacionamientos"), size=2)+
  scale_color_manual(values = c("Estacionamientos"="blue"))+
  labs(title = "¿Dónde se ubican los estacionamientos del Microcentro porteño?",
       color="",
       subtitle = "",
       caption = "Fuente: BA Data")+
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5),
        legend.position = "bottom",
        legend.box.background = element_rect(color = "black"),
        legend.box.margin = margin(3,6,3,6))

Ahora, analizaremos la ubicación de los estacionamientos en referencia a los espacios verdes y su cobertura. Particularmente, nos centraremos en identificar el rango de manzanas que se puden cubrir a pie en 5 minutos o menos desde un espacio verde.

puntosEspaciosVerdes <- map(1:nrow(espacioverde),function(x){st_sample(espacioverde[x,],size=4)})
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
puntosEspaciosVerdes <- do.call("c",puntosEspaciosVerdes)
puntosEspaciosVerdesSF <- st_as_sf(puntosEspaciosVerdes)
puntosEspaciosVerdesSF <- st_transform(puntosEspaciosVerdesSF,crs=4326)
isocronosEspaciosVerdes <- map(1:nrow(puntosEspaciosVerdesSF),function(x) {cat("Procesando: ",x,"\r")
  isoline(puntosEspaciosVerdesSF[x,], transport_mode = "pedestrian",range_type = "time",range = 60*5)})
## Procesando:  1 
Procesando:  2 
Procesando:  3 
Procesando:  4 
Procesando:  5 
Procesando:  6 
Procesando:  7 
Procesando:  8 
Procesando:  9 
Procesando:  10 
Procesando:  11 
Procesando:  12 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  13 
Procesando:  14 
Procesando:  15 
Procesando:  16 
Procesando:  17 
Procesando:  18 
Procesando:  19 
Procesando:  20 
Procesando:  21 
Procesando:  22 
Procesando:  23 
Procesando:  24 
Procesando:  25 
Procesando:  26 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  27 
Procesando:  28 
Procesando:  29 
Procesando:  30 
Procesando:  31 
Procesando:  32 
Procesando:  33 
Procesando:  34 
Procesando:  35 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  36 
Procesando:  37 
Procesando:  38 
Procesando:  39 
Procesando:  40 
Procesando:  41 
Procesando:  42 
Procesando:  43 
Procesando:  44 
Procesando:  45 
Procesando:  46 
Procesando:  47 
Procesando:  48 
Procesando:  49 
Procesando:  50 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  51 
Procesando:  52 
Procesando:  53 
Procesando:  54 
Procesando:  55 
Procesando:  56 
Procesando:  57 
Procesando:  58 
Procesando:  59 
Procesando:  60 
Procesando:  61 
Procesando:  62 
Procesando:  63 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  64 
Procesando:  65 
Procesando:  66 
Procesando:  67 
Procesando:  68 
Procesando:  69 
Procesando:  70 
Procesando:  71 
Procesando:  72 
Procesando:  73 
Procesando:  74 
Procesando:  75 
Procesando:  76 
Procesando:  77 
Procesando:  78 
Procesando:  79 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  80 
Procesando:  81 
Procesando:  82 
Procesando:  83 
Procesando:  84 
Procesando:  85 
Procesando:  86 
Procesando:  87 
Procesando:  88 
Procesando:  89 
Procesando:  90 
Procesando:  91 
Procesando:  92 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  93 
Procesando:  94 
Procesando:  95 
Procesando:  96 
Procesando:  97 
Procesando:  98 
Procesando:  99 
Procesando:  100 
Procesando:  101 
Procesando:  102 
Procesando:  103 
Procesando:  104 
Procesando:  105 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  106 
Procesando:  107 
Procesando:  108 
Procesando:  109 
Procesando:  110 
Procesando:  111 
Procesando:  112 
Procesando:  113 
Procesando:  114 
Procesando:  115 
Procesando:  116 
Procesando:  117 
Procesando:  118 
Procesando:  119 
Procesando:  120 
Procesando:  121 
Procesando:  122 
Procesando:  123 
Procesando:  124 
Procesando:  125 
Procesando:  126 
Procesando:  127 
Procesando:  128 
Procesando:  129 
Procesando:  130 
Procesando:  131 
Procesando:  132 
Procesando:  133 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  134 
Procesando:  135 
Procesando:  136 
Procesando:  137 
Procesando:  138 
Procesando:  139 
Procesando:  140 
Procesando:  141 
Procesando:  142 
Procesando:  143 
Procesando:  144 
Procesando:  145 
Procesando:  146 
Procesando:  147 
Procesando:  148 
Procesando:  149 
Procesando:  150 
Procesando:  151 
Procesando:  152 
Procesando:  153 
Procesando:  154 
Procesando:  155 
Procesando:  156 
Procesando:  157 
Procesando:  158 
Procesando:  159 
Procesando:  160 
Procesando:  161 
Procesando:  162 
Procesando:  163 
Procesando:  164 
Procesando:  165 
Procesando:  166 
Procesando:  167 
Procesando:  168 
Procesando:  169 
Procesando:  170 
Procesando:  171 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  172 
Procesando:  173 
Procesando:  174 
Procesando:  175 
Procesando:  176 
Procesando:  177 
Procesando:  178 
Procesando:  179 
Procesando:  180 
Procesando:  181 
Procesando:  182 
Procesando:  183 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  184 
Procesando:  185 
Procesando:  186 
Procesando:  187 
Procesando:  188 
Procesando:  189 
Procesando:  190 
Procesando:  191 
Procesando:  192 
Procesando:  193 
Procesando:  194 
Procesando:  195 
Procesando:  196 
Procesando:  197 
Procesando:  198 
Procesando:  199 
Procesando:  200 
Procesando:  201 
Procesando:  202 
Procesando:  203 
Procesando:  204 
Procesando:  205 
Procesando:  206 
Procesando:  207 
Procesando:  208 
Procesando:  209 
Procesando:  210 
Procesando:  211 
Procesando:  212 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  213 
Procesando:  214 
Procesando:  215 
Procesando:  216 
Procesando:  217 
Procesando:  218 
Procesando:  219 
Procesando:  220 
Procesando:  221 
Procesando:  222 
Procesando:  223 
Procesando:  224 
Procesando:  225 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  226 
Procesando:  227 
Procesando:  228 
Procesando:  229 
Procesando:  230 
Procesando:  231 
Procesando:  232 
Procesando:  233 
Procesando:  234 
Procesando:  235 
Procesando:  236 
Procesando:  237 
Procesando:  238 
Procesando:  239 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  240 
Procesando:  241 
Procesando:  242 
Procesando:  243 
Procesando:  244 
Procesando:  245 
Procesando:  246 
Procesando:  247 
Procesando:  248 
Procesando:  249 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  250 
Procesando:  251 
Procesando:  252 
Procesando:  253 
Procesando:  254 
Procesando:  255 
Procesando:  256 
Procesando:  257 
Procesando:  258 
Procesando:  259 
Procesando:  260 
Procesando:  261 
Procesando:  262 
Procesando:  263 
Procesando:  264 
Procesando:  265 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  266 
Procesando:  267 
Procesando:  268 
Procesando:  269 
Procesando:  270 
Procesando:  271 
Procesando:  272 
Procesando:  273 
Procesando:  274 
Procesando:  275 
Procesando:  276 
Procesando:  277 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  278 
Procesando:  279 
Procesando:  280 
Procesando:  281 
Procesando:  282 
Procesando:  283 
Procesando:  284 
Procesando:  285 
Procesando:  286 
Procesando:  287 
Procesando:  288 
Procesando:  289 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  290 
Procesando:  291 
Procesando:  292 
Procesando:  293 
Procesando:  294 
Procesando:  295 
Procesando:  296 
Procesando:  297 
Procesando:  298 
Procesando:  299 
Procesando:  300 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  301 
Procesando:  302 
Procesando:  303 
Procesando:  304 
Procesando:  305 
Procesando:  306 
Procesando:  307 
Procesando:  308 
Procesando:  309 
Procesando:  310 
Procesando:  311 
Procesando:  312 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  313 
Procesando:  314 
Procesando:  315 
Procesando:  316 
Procesando:  317 
Procesando:  318 
Procesando:  319 
Procesando:  320 
Procesando:  321 
Procesando:  322 
Procesando:  323 
Procesando:  324 
Procesando:  325 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
## Procesando:  326 
Procesando:  327 
Procesando:  328 
Procesando:  329 
Procesando:  330 
Procesando:  331 
Procesando:  332 
Procesando:  333 
Procesando:  334 
Procesando:  335 
Procesando:  336 
isocronosEspaciosVerdesJuntas <- do.call(rbind,isocronosEspaciosVerdes)
isocronosEspaciosVerdesJuntasUnion <-  st_union(isocronosEspaciosVerdesJuntas)
## although coordinates are longitude/latitude, st_union assumes that they are planar
isocronosEspaciosVerdesJuntasUnion <- st_as_sf(isocronosEspaciosVerdesJuntasUnion) %>% 
                                      mutate(cobertura=TRUE)

Graficamos

ggplot()+
  geom_sf(data = microcentro, fill="grey96")+
  geom_sf(data = espacioverde, fill="springgreen2")+
  geom_sf(data = estacionamientos, aes(color="Estacionamientos"), size=2)+
  geom_sf(data = isocronosEspaciosVerdesJuntasUnion, aes(fill="Cobertura de espacios verdes"), alpha=0.25, color="black")+
  scale_color_manual(values = c("Estacionamientos"="blue"))+
  scale_fill_manual(values = c("Cobertura de espacios verdes"="lightgreen"))+
 labs(title = "¿Cuál es la cobertura de espacios verdes del Microcentro?",
      color="",
      fill="",
      subtitle = "Manzanas a 5 min. o menos de un espacio verde",
      caption = "Fuente: BA Data")+
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5, face="bold"),
        plot.subtitle = element_text(hjust = 0.5),
        legend.position = "bottom",
        legend.box.background = element_rect(color = "black"),
        legend.box.margin = margin(3,6,3,6))

Ahora comparemos los estacionamientos, pero utilizando las estaciones de Ecobicis y su cobertura como referencia. Repitamos el proceso.

bbox_microcentro <- as.numeric(st_bbox(microcentro))
mapamicrocentro <- get_stamenmap(bbox = bbox_microcentro,
                          maptype = "toner-lite",
                          zoom=15)
## Source : http://tile.stamen.com/toner-lite/15/11066/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11067/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11068/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11069/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11070/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11071/19744.png
## Source : http://tile.stamen.com/toner-lite/15/11066/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11067/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11068/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11069/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11070/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11071/19745.png
## Source : http://tile.stamen.com/toner-lite/15/11066/19746.png
## Source : http://tile.stamen.com/toner-lite/15/11067/19746.png
## Source : http://tile.stamen.com/toner-lite/15/11068/19746.png
## Source : http://tile.stamen.com/toner-lite/15/11069/19746.png
## Source : http://tile.stamen.com/toner-lite/15/11070/19746.png
## Source : http://tile.stamen.com/toner-lite/15/11071/19746.png
bicis <- st_read("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis.geojson")
## Reading layer `estaciones_de_bicicletas_WGS84' from data source `https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis.geojson' using driver `GeoJSON'
## Simple feature collection with 229 features and 7 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -58.51142 ymin: -34.66051 xmax: -58.35574 ymax: -34.5445
## Geodetic CRS:  WGS 84
bicis <- st_intersection(bicis, microcentro)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
isocronosbicis <- map(1:nrow(bicis),function(x) {cat("Procesando: ",x,"\r")
  isoline(bicis[x,], transport_mode = "pedestrian",range_type = "time",range = 60*5)})
## Procesando:  1 
Procesando:  2 
Procesando:  3 
Procesando:  4 
Procesando:  5 
Procesando:  6 
Procesando:  7 
Procesando:  8 
Procesando:  9 
Procesando:  10 
Procesando:  11 
Procesando:  12 
Procesando:  13 
Procesando:  14 
## Warning in .parse_response(i, out$responses()[[i]]): Request 'id = 1' failed:
## Status 429.
isocronosbicisjuntas <- do.call(rbind,isocronosbicis)
isocronosbicisjuntasunion <-  st_union(isocronosbicisjuntas)
## although coordinates are longitude/latitude, st_union assumes that they are planar
isocronosbicisjuntasunion <- st_as_sf(isocronosbicisjuntasunion) %>% 
                                      mutate(cobertura=TRUE)

Grafiquemos

ggmap(mapamicrocentro)+
  geom_sf(data = microcentro, fill="grey96", inherit.aes = FALSE)+
  geom_sf(data = espacioverde, fill="mediumseagreen", inherit.aes = FALSE)+
  geom_sf(data=bicis, aes(color="Ecobicis"), size=2, inherit.aes = FALSE)+
  geom_sf(data = estacionamientos, aes(color="Estacionamientos"), size=2, inherit.aes = FALSE)+
  geom_sf(data = isocronosbicisjuntasunion, aes(fill="A 5 min o menos a pie de una estación de Ecobicis"), color="coral1", alpha=0.20, color="black", inherit.aes = FALSE)+
  scale_fill_manual(values = c("A 5 min o menos a pie de una estación de Ecobicis"="chocolate2"))+
  scale_color_manual(values = c("Estacionamientos"="blue", "Ecobicis"="orangered"))+
 labs(title = "¿Y si transformamos los estacionamientos del centro porteño en espacios verdes?",
      subtitle = "",
      fill="",
      color="",
      caption = "Fuente: BA Data")+
  theme_void()+
  theme(plot.title = element_text(size= 12, hjust = 0.5,  face="bold"),
        plot.caption=element_text(face = "italic", size=8),
        legend.position = "bottom",
        legend.box.background = element_rect(color = "black"),
        legend.box.margin = margin(3,6,3,6))
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
## Warning: Duplicated aesthetics after name standardisation: colour


Trabajo Práctico N°2

Consignas

  1. Descargar de OpenStreetMap la grilla de calles para la Ciudad elegida en el ejercicio 1 y mapearla por uno de sus atributos (velocidad mínima, velocidad máxima, cantidad de carriles, etc).

Primero, creamos la caja de coordenadas de la CABA.

bbox_CABA <- getbb("Ciudad Autónoma de Buenos Aires, Argentina")

Nos fijamos que las coordenadas extraídas sean las precisas.

mapa_CABA <- get_stamenmap(bbox = bbox_CABA,
                          maptype = "terrain",
                          zoom=12)
## Source : http://tile.stamen.com/terrain/12/1382/2467.png
## Source : http://tile.stamen.com/terrain/12/1383/2467.png
## Source : http://tile.stamen.com/terrain/12/1384/2467.png
## Source : http://tile.stamen.com/terrain/12/1382/2468.png
## Source : http://tile.stamen.com/terrain/12/1383/2468.png
## Source : http://tile.stamen.com/terrain/12/1384/2468.png
## Source : http://tile.stamen.com/terrain/12/1382/2469.png
## Source : http://tile.stamen.com/terrain/12/1383/2469.png
## Source : http://tile.stamen.com/terrain/12/1384/2469.png
ggmap(mapa_CABA)+
  theme_void()

Segundo, creamos un dataset con las calles de CABA. Para ello:

1º. Consultamos la info disponible.

CABA_calles <- opq(bbox_CABA) %>% 
  add_osm_feature(key="highway") 

2º. Descargamos la info.

CABA_calles <- osmdata_sf(CABA_calles)

3º. Seleccionamos solo las líneas y las asignamos a nuestra lista para que se transfome en un dataset.

CABA_calles <- CABA_calles$osm_lines

Graficamos para ver el resultado

ggmap(mapa_CABA)+
  geom_sf(data = CABA_calles, color="deepskyblue4", alpha=0.5, inherit.aes = FALSE)+
  labs(title="Calles de la Ciudad Autónoma de Buenos Aires",
       caption="Fuente: Open Street Map")+
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

Como vemos, no solo nos descarga las calles de la CABA sino de todo el sistema de coordenadas. Para solucionar ese problema, haremos lo siguiente:

1º Descargamos el límite de la CABA.

bbox_CABA_limite <- getbb("Ciudad Autónoma de Buenos Aires, Argentina", format_out = "sf_polygon")
bbox_CABA_limite <- bbox_CABA_limite$multipolygon
ggmap(mapa_CABA)+
  geom_sf(data=bbox_CABA_limite, fill=NA, size=1, color="firebrick3", inherit.aes = FALSE)+
  labs(title="Ciudad Autónoma de Buenos Aires",
       caption="Fuente: Open Street Map")+
  theme_void()
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

2º Intersectamos nuestro dataset de calles con el del límite.

CABA_calles <- st_intersection(CABA_calles, bbox_CABA_limite)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Graficamos

ggmap(mapa_CABA)+
  geom_sf(data=bbox_CABA_limite, fill=NA, size=1, color="firebrick3", inherit.aes = FALSE)+
  geom_sf(data = CABA_calles, color="deepskyblue4", alpha=0.5, inherit.aes = FALSE)+
  labs(title="Calles de la Ciudad Autónoma de Buenos Aires",
       caption="Fuente: Open Street Map")+
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5))
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

Por último, coloreamos nuestras calles de acuerdo a la velocidad máxima permitida.

CABA_calles <- mutate(CABA_calles, maxspeed= fct_relevel(maxspeed, "5", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "130"))

ggmap(mapa_CABA)+
  geom_sf(data = filter(CABA_calles, !(is.na(maxspeed))), aes(color=maxspeed), fill=NA, inherit.aes = FALSE)+
  scale_color_viridis_d()+
    labs(title="Calles de la Ciudad Autónoma de Buenos Aires",
       color="Velocidad máxima (KM/H)",
       caption="Fuente: Open Street Map")+
  theme_void()
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

  1. Descargar de OpenStreetMap una (o más) capas de datos de tipo puntos o polígonos. (Ver catálogo de categorías en https://wiki.openstreetmap.org/wiki/Map_Features) 2. a. Proyectar los datos descargados en un mapa y comentar los resultados: ¿Cómo se distribuyen en la Ciudad?

En línea con nuestro trabajo anterior, procederemos a descargar los estacionamientos de la CABA.

parking_CABA_OSM <- opq (bbox_CABA) %>% 
  add_osm_feature(key="building", value="parking")
parking_CABA_OSM <- osmdata_sf(parking_CABA_OSM)
parking_CABA_OSM <- parking_CABA_OSM$osm_points

Graficamos para ver su ubicación.

ggmap(mapa_CABA)+
  geom_sf(data = parking_CABA_OSM, aes(color="Estacionamientos"), inherit.aes = FALSE)+
  scale_color_manual(values = c("Estacionamientos"="red2"))+
    labs(title="Ciudad Autónoma de Buenos Aires",
       color="Referencias",
       caption="Fuente: Open Street Map")+
  theme_void()
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

Al igual que hicimos con las calles, nos quedaremos unicamente con los estacionamientos que se encuentren dentro de la CABA.

parking_CABA_OSM <- st_intersection(parking_CABA_OSM, bbox_CABA_limite)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries

Nos quedamos solo con los valores únicos.

parking_CABA_OSM <- unique(parking_CABA_OSM)

Graficamos para ver los resultados

ggmap(mapa_CABA)+
  geom_sf(data = parking_CABA_OSM, aes(color="Estacionamientos"), inherit.aes = FALSE)+
  scale_color_manual(values = c("Estacionamientos"="red2"))+
    labs(title="Ciudad Autónoma de Buenos Aires",
       color="Referencias",
       caption="Fuente: Open Street Map")+
  theme_void()
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

Al ver el mapa anterior, podemos observar que hay algo que no anda bien. Nuestro dataset de estacionamientos contiene 87 registros, aunque sólo aparecen geolocalizados unos pocos puntos. Ello puede deberse a que la posición de los mismos está mal cargada.

No obstante, en Open Street Maps es posible encontrar que los estacionamientos se encuentran divididos en múltiples categorías. Probemos con otra categoría mucho más amplia que la original y repitamos el proceso:

parking_CABA_OSM_B <- opq (bbox_CABA) %>% 
  add_osm_feature(key="amenity", value="parking")
parking_CABA_OSM_B <- osmdata_sf(parking_CABA_OSM_B) 
parking_CABA_OSM_B <- parking_CABA_OSM_B$osm_points
parking_CABA_OSM_B <- st_intersection(parking_CABA_OSM_B, bbox_CABA_limite)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
## Warning: attribute variables are assumed to be spatially constant throughout all
## geometries
parking_CABA_OSM_B <- unique(parking_CABA_OSM_B)

Grafiquemos

ggmap(mapa_CABA)+
  geom_sf(data = parking_CABA_OSM_B, aes(color="Estacionamientos"), inherit.aes = FALSE)+
  scale_color_manual(values = c("Estacionamientos"="red2"))+
    labs(title="Ciudad Autónoma de Buenos Aires",
       color="Referencias",
       caption="Fuente: Open Street Map")+
  theme_void()
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

Como podemos ver en el mapa anterior, la mayor concentración de estacionamientos se da en el corredor que se extiende desde el centro de la CABA hacia el norte. No obstante, es importante reconocer que los estacionamientos se muestran distribudios a lo largo y ancho de la ciudad.

    1. Hacer un conteo de los ítems de la capa descargada por barrio, mapearlo y compararlo con el conteo de los ítems descargados en el ejercicio anterior: ¿La distribución es similar o hay diferencias? ¿A qué se puede deber?

Ahora, crucemos nuestro dataset de estacionamientos con el de barrios para conocer su distribución por cada uno de estos.

parking_CABA_OSM_B <- st_transform(parking_CABA_OSM_B, crs = st_crs(barrios))
parking_CABA_OSM_B <- st_join(parking_CABA_OSM_B, barrios)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar

Agrupemos los casos por barrio.

parking_CABA_OSM_barrio <- parking_CABA_OSM_B %>% 
  group_by(barrio) %>% 
  summarise(Q_estacionamientos=(n())) %>% 
  st_set_geometry(NULL) %>% 
  as.data.frame() %>% 
  filter(!is.na(barrio))
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar
## although coordinates are longitude/latitude, st_union assumes that they are planar

Grafiquemos.

ggplot()+
  geom_bar(data=parking_CABA_OSM_barrio %>% filter(Q_estacionamientos !=0), aes(y=reorder(barrio, -Q_estacionamientos), weight=Q_estacionamientos, fill=barrio), show.legend = FALSE)+
  scale_fill_viridis_d()+
  labs(x="Cantidad de estacionamientos", 
       y="Barrio",
       title="¿Cuántos estacionamientos por barrio existen en la CABA \n\ según OSM?", 
       caption="Fuente: OSM")+
  scale_x_continuous(breaks = seq(0, 500, 50))+
  theme_minimal()

parking_CABA <- left_join(barrios, parking_CABA_OSM_barrio, by="barrio")

Visualizamos

ggplot()+
  geom_sf(data=barrios, fill="white")+
  geom_sf(data=parking_CABA %>% filter(Q_estacionamientos!=0), aes(fill=Q_estacionamientos), alpha=.5, show.legend = FALSE)+
  geom_sf_text(data=parking_CABA, aes(label=Q_estacionamientos), size=4, fontface = "bold")+
  scale_fill_viridis_c()+
  labs(title="¿Cuántos estacionamientos concesionados hay por barrio según OSM?",
              caption="Fuente: OSM")+
  theme_void()+
  theme(plot.title = element_text( hjust = 0.5))
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning: Removed 3 rows containing missing values (geom_text).

Comparemoslo con nuestro GEOJSON original.

ggplot()+
  geom_sf(data=barrios, fill="white")+
  geom_sf(data=estacionamientos_barrio %>% filter(cantidad!=0), aes(fill=cantidad), alpha=.5, show.legend = FALSE)+
  geom_sf_text(data=estacionamientos_barrio, aes(label=cantidad), size=4, fontface = "bold")+
  scale_fill_viridis_c()+
  labs(title="¿Cuántos estacionamientos concesionados hay por barrio?",
              caption="Fuente: GCBA")+
  theme_void()+
  theme(plot.title = element_text( hjust = 0.5))
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data
## Warning: Removed 39 rows containing missing values (geom_text).

La primer observación que obtenemos es que nuestro N aumento considerablemente. Luego, si bien la mayor concentración de estacionamientos se da en el eje Centro - Norte de la CABA (siendo Palermo el principal barrio ahora), existe una oferta cosiderable en barrios perífericos como Lugano, Caballito, La Boca, Flores y Villa Soldati.

Estas diferencias pueden deverse a varios factores. Sin embargo, es importante reconocer que, mientras nuestro GEOJSON original nos daba sólo la ubicación de los estacionamientos concesionados, el nuevo dataset con datos de OSM ofrece información de todos los tipos de estacionamientos existentes en la CABA.

Veamos las diferencias con mayor precisión:

estacionamientos_barrio[is.na(estacionamientos_barrio)] <- 0

parking_OSM_GCBA <- left_join(parking_CABA_OSM_barrio, estacionamientos_barrio, by="barrio") %>% 
  rename("cantidad_GCBA"="cantidad") %>% 
  group_by(barrio, Q_estacionamientos, cantidad_GCBA) %>%
  summarise(diferencia= Q_estacionamientos-cantidad_GCBA)
## `summarise()` has grouped output by 'barrio', 'Q_estacionamientos'. You can override using the `.groups` argument.
head(parking_OSM_GCBA, y=reorder(barrio, -diferencia))
## # A tibble: 6 x 4
## # Groups:   barrio, Q_estacionamientos [6]
##   barrio    Q_estacionamientos cantidad_GCBA diferencia
##   <chr>                  <int>         <dbl>      <dbl>
## 1 AGRONOMIA                 39             0         39
## 2 ALMAGRO                   71             0         71
## 3 BALVANERA                168             7        161
## 4 BARRACAS                  68             0         68
## 5 BELGRANO                 319             1        318
## 6 BOCA                     108             0        108
ggplot()+
  geom_bar(data=parking_OSM_GCBA, aes(y=reorder(barrio, -Q_estacionamientos), weight=Q_estacionamientos, fill=barrio), show.legend = FALSE)+
  geom_bar(data=parking_OSM_GCBA, aes(y=reorder(barrio, -Q_estacionamientos), weight=cantidad_GCBA, fill=barrio), fill="red", show.legend = FALSE)+
  scale_fill_viridis_d()+
  labs(x="Diferencia (cantidad de estacionamientos)", 
       y="Barrio",
       title="¿Cuánto difieren los datos de OSM con respecto a los del GCBA?", 
       caption="Fuente: GCBA + OSM",
       fill="Estacionamientos GCBA")+
  scale_x_continuous(breaks = seq(0, 500, 50))+
  theme_minimal()

Mapeamos las diferencias para el área del Microcentro porteño.

parking_microcentro <- parking_CABA_OSM_B %>% 
  filter(barrio=="MONSERRAT" | barrio=="BALVANERA" | barrio=="SAN NICOLAS") %>% 
  filter(parking!="underground" | layer!="-1")
ggplot()+
  geom_sf(data = microcentro, fill="grey96")+
  geom_sf(data = espacioverde, fill="springgreen2")+
  geom_sf(data = estacionamientos, aes(color="Estacionamientos GCBA"), size=2, alpha=0.5)+
  geom_sf(data=parking_microcentro, aes(color="Estacionamientos OSM"), size=2, alpha=0.5)+
  scale_color_manual(values = c("Estacionamientos GCBA"="blue", "Estacionamientos OSM"="red"))+
  labs(title = "¿Dónde se ubican los estacionamientos del Microcentro porteño \n según las distintas fuentes?",
       color="",
       subtitle = "",
       caption = "Fuente: BA Data")+
  theme_void()+
  theme(plot.title = element_text(hjust = 0.5),
        legend.position = "bottom",
        legend.box.background = element_rect(color = "black"),
        legend.box.margin = margin(3,6,3,6))

Como podemos observar, las diferencias entre los datos provistos por el GEOJSON y los datos recolectados por OSM divergen considerablemente. Esto es así de tal manera que ambos sets de datos sólo coinciden en la ubicación de dos estacionamientos.


Trabajo Práctico N°3

Consignas

  1. Utilizar algún dataset open data de la Ciudad con la que están trabajando que tenga tanto coordenadas como fechas.

En esta parte del trabajo, retomaremos el análisis de las ecobicis y los viajes realizados en el área central de la Ciudad de Buenos Aires. Ello nos permitirá estudiar con mayor precisión el nivel de movilidad en el área durante la pandemia y hacer suposiciones sobre como podría impactar la promoción de nuevos espacios verdes en la zona.

Con este fin, utilizaremos el datset de viajes en bicicleta del año 2020:

ACLARACIÓN: Debido al tamaño del dataset original y su imposibilidad de subirlo a github, optamos por utilizar una versión más pequeña que solo contiene los viajes iniciados en estaciones del Microcentro porteño.

bicis_2020 <- read_csv("https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv")
## Warning: Missing column names filled in: 'X1' [1]
## 
## -- Column specification --------------------------------------------------------
## cols(
##   .default = col_double(),
##   fecha_origen_recorrido = col_datetime(format = ""),
##   nombre_estacion_origen = col_character(),
##   MANZANA = col_character(),
##   SECCION = col_character(),
##   OBS = col_logical(),
##   MZ_TIPO = col_character(),
##   LFI = col_character(),
##   LIB = col_character(),
##   SM = col_character(),
##   barrio = col_character(),
##   geometry = col_character()
## )
## i Use `spec()` for the full column specifications.
## Warning: 109490 parsing failures.
## row col   expected     actual                                                                                  file
##   1  -- 24 columns 26 columns 'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'
##   2  -- 24 columns 26 columns 'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'
##   3  -- 24 columns 26 columns 'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'
##   4  -- 24 columns 26 columns 'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'
##   5  -- 24 columns 26 columns 'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'
## ... ... .......... .......... .....................................................................................
## See problems(...) for more details.
  1. Análisis Temporal: Realizar al menos 1 gráfico que les permita analizar la temporalidad de los datos. ¿Detectan algún patrón temporal? ¿A qué puede deberse?.
str(bicis_2020)
## spec_tbl_df [109,490 x 24] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ X1                    : num [1:109490] 14674 14675 14676 14677 14678 ...
##  $ duracion_recorrido    : num [1:109490] 1570 1648 1283 1700 1772 ...
##  $ id_estacion_origen    : num [1:109490] 51 51 51 51 51 51 51 51 51 51 ...
##  $ fecha_origen_recorrido: POSIXct[1:109490], format: "2020-12-11 20:40:27" "2020-11-21 18:05:19" ...
##  $ nombre_estacion_origen: chr [1:109490] "051 - TUCUMAN" "051 - TUCUMAN" "051 - TUCUMAN" "051 - TUCUMAN" ...
##  $ lon                   : num [1:109490] -58.4 -58.4 -58.4 -58.4 -58.4 ...
##  $ lat                   : num [1:109490] -34.6 -34.6 -34.6 -34.6 -34.6 ...
##  $ FeatId1               : num [1:109490] 5507 5507 5507 5507 5507 ...
##  $ MANZANA               : chr [1:109490] "063B" "063B" "063B" "063B" ...
##  $ SECCION               : chr [1:109490] "005" "005" "005" "005" ...
##  $ NIVEL                 : num [1:109490] 15.8 15.8 15.8 15.8 15.8 15.8 15.8 15.8 15.8 15.8 ...
##  $ OBS                   : logi [1:109490] NA NA NA NA NA NA ...
##  $ MZ_TIPO               : chr [1:109490] "TIPICA" "TIPICA" "TIPICA" "TIPICA" ...
##  $ CANT_LADOS            : num [1:109490] 4 4 4 4 4 4 4 4 4 4 ...
##  $ MZ_SUP                : num [1:109490] 1903 1903 1903 1903 1903 ...
##  $ CANT_PA               : num [1:109490] 0 0 0 0 0 0 0 0 0 0 ...
##  $ LFI                   : chr [1:109490] "NO" "NO" "NO" "NO" ...
##  $ LIB                   : chr [1:109490] "NO" "NO" "NO" "NO" ...
##  $ SM                    : chr [1:109490] "005-063B" "005-063B" "005-063B" "005-063B" ...
##  $ barrio                : chr [1:109490] "SAN NICOLAS" "SAN NICOLAS" "SAN NICOLAS" "SAN NICOLAS" ...
##  $ comuna                : num [1:109490] 1 1 1 1 1 1 1 1 1 1 ...
##  $ perimetro             : num [1:109490] 6548 6548 6548 6548 6548 ...
##  $ area                  : num [1:109490] 2289008 2289008 2289008 2289008 2289008 ...
##  $ geometry              : chr [1:109490] "c(-58.3821223276689" "c(-58.3821223276689" "c(-58.3821223276689" "c(-58.3821223276689" ...
##  - attr(*, "problems")= tibble [109,490 x 5] (S3: tbl_df/tbl/data.frame)
##   ..$ row     : int [1:109490] 1 2 3 4 5 6 7 8 9 10 ...
##   ..$ col     : chr [1:109490] NA NA NA NA ...
##   ..$ expected: chr [1:109490] "24 columns" "24 columns" "24 columns" "24 columns" ...
##   ..$ actual  : chr [1:109490] "26 columns" "26 columns" "26 columns" "26 columns" ...
##   ..$ file    : chr [1:109490] "'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'" "'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'" "'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'" "'https://raw.githubusercontent.com/MEU-CDPC2/TPS/main/Datasets/bicis_microcentro.csv'" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   X1 = col_double(),
##   ..   duracion_recorrido = col_double(),
##   ..   id_estacion_origen = col_double(),
##   ..   fecha_origen_recorrido = col_datetime(format = ""),
##   ..   nombre_estacion_origen = col_character(),
##   ..   lon = col_double(),
##   ..   lat = col_double(),
##   ..   FeatId1 = col_double(),
##   ..   MANZANA = col_character(),
##   ..   SECCION = col_character(),
##   ..   NIVEL = col_double(),
##   ..   OBS = col_logical(),
##   ..   MZ_TIPO = col_character(),
##   ..   CANT_LADOS = col_double(),
##   ..   MZ_SUP = col_double(),
##   ..   CANT_PA = col_double(),
##   ..   LFI = col_character(),
##   ..   LIB = col_character(),
##   ..   SM = col_character(),
##   ..   barrio = col_character(),
##   ..   comuna = col_double(),
##   ..   perimetro = col_double(),
##   ..   area = col_double(),
##   ..   geometry = col_character()
##   .. )

Como podemos ver, nuestro dataset ya cuenta con los registros de fecha y hora en su formato correspondiente, por lo que ya podemos trabajar sobre los datos.

A fin de lograr una mayor precisión temporal, realizaremos algunas otras modificaciones al dataset.

  • 1º. Identificamos el día y el mes en el que se realizó cada viaje.
bicis_2020 <- bicis_2020 %>% 
  mutate(dia = wday(fecha_origen_recorrido, label = TRUE, abbr = FALSE),
         mes = month(fecha_origen_recorrido, label = TRUE, abbr = FALSE))
  • 2º. Creamos una columna que contenga la hora de inicio de cada viaje.
bicis_2020 <- bicis_2020 %>% 
  mutate(hora = hour(fecha_origen_recorrido))
  • 3º. Calculamos la duración de cada recorrido.
head(bicis_2020)
## # A tibble: 6 x 27
##      X1 duracion_recorri~ id_estacion_orig~ fecha_origen_recor~ nombre_estacion~
##   <dbl>             <dbl>             <dbl> <dttm>              <chr>           
## 1 14674              1570                51 2020-12-11 20:40:27 051 - TUCUMAN   
## 2 14675              1648                51 2020-11-21 18:05:19 051 - TUCUMAN   
## 3 14676              1283                51 2020-11-13 18:32:19 051 - TUCUMAN   
## 4 14677              1700                51 2020-11-10 18:14:46 051 - TUCUMAN   
## 5 14678              1772                51 2020-11-02 17:35:41 051 - TUCUMAN   
## 6 14679              1498                51 2020-10-06 16:14:48 051 - TUCUMAN   
## # ... with 22 more variables: lon <dbl>, lat <dbl>, FeatId1 <dbl>,
## #   MANZANA <chr>, SECCION <chr>, NIVEL <dbl>, OBS <lgl>, MZ_TIPO <chr>,
## #   CANT_LADOS <dbl>, MZ_SUP <dbl>, CANT_PA <dbl>, LFI <chr>, LIB <chr>,
## #   SM <chr>, barrio <chr>, comuna <dbl>, perimetro <dbl>, area <dbl>,
## #   geometry <chr>, dia <ord>, mes <ord>, hora <int>

Como vemos, la columna “duración_recorrido” ya cuenta con la información, pero expresada en segundos. Por lo tanto, sólo nos limitaremos a traducirla en minutos.

bicis_2020 <- bicis_2020 %>%
  mutate(duracion_minutos = round(as.numeric(as.duration(duracion_recorrido), "minutes"),2)) 

¿Cúantos minutos duran los viajes en bicicleta iniciados en el microcentro en promedio?

paste(round(mean(bicis_2020$duracion_minutos),2), " minutos es el promedio de duracion de viajes. Sin embargo, la mediana está en ", round(median(bicis_2020$duracion_minutos),2), " minutos, por lo que reconocemos que la distribución de los datos tiene una cola hacia la derecha")
## [1] "22.13  minutos es el promedio de duracion de viajes. Sin embargo, la mediana está en  16.43  minutos, por lo que reconocemos que la distribución de los datos tiene una cola hacia la derecha"

Ahora, grafiquemos para ver como se distribuyen los viajes según su duración-

ggplot(bicis_2020, aes(duracion_minutos)) +
  geom_histogram(bins=50, fill="orange", alpha=.5, color="black")+
  labs(x="Duración en minutos", 
       y="Cantidad de viajes",
       title="¿Cómo es la distribución de viajes según su duración?", 
       subtitle = "Expresado en escala logarítica",
       caption="Fuente: GCBA")+
  scale_y_log10()+
  scale_x_log10()+
  theme_minimal()
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 12 rows containing missing values (geom_bar).

Notamos la presencia de valores extremos, tanto superiores como inferiores. Esto puede deberse, por ejemplo, a una falla en la aplicación, o a usuarios que desbloquearon una bicicleta y la devolvieron instáneamente. Un análisis profundo sobre la duración de los viajes debería contemplar la limpieza de dichos outliers y trabajar exclusivamente con valores representativos.

¿Cómo fue la distribución a lo largo del año? ¿Se reconoce el impacto de la pandemia en el comportamiento de los usuarios?

ggplot(bicis_2020) + 
  geom_bar(aes(x = mes), fill="orange", alpha=.5, color="black") +
  scale_y_continuous(limit = c(0, 20000), breaks = seq(0, 20000, 5000))+
  labs(title = "Cantidad de viajes en bicicleta en el Microcentro",
       subtitle = "Año 2020",
       x = "Mes",
       y = "Viajes",
       caption = "Fuente: BA Data")+
  theme_minimal()+
  theme(axis.text.x = element_text(face="bold", size = 7))

Curiosamente, a partir del mes de agosto (a 5 meses de haber arrancado la cuarentena), el volumen de viajes en bicicleta en el microcentro porteño supera al valor de enero, el máximo en el año previo al inicio de la pandemia. Sin embargo, ello no quiere decir que más gente use la bicicleta que en niveles pre pandemicos. Es importante mencionar que, año tras año, durante los primeros meses del calendario, la circulación en esta área geografica se reduce significativamente en comparación con su volumen habitual del resto del ciclo anual. Por ello, para poder llegar a una conclusión más profunda sobre los parámetros de uso, debiese de compararse la información con la del año 2019 (A los fines de este trabajo, omitiremos este paso por el momento).

Veamos que sucede a lo largo de las días de la semana.

ggplot(bicis_2020) + 
  geom_bar(aes(x = dia), fill="orange", alpha=.5, color="black") +
  scale_y_continuous(limit = c(0, 20000), breaks = seq(0, 20000, 5000))+
  labs(title = "Cantidad de viajes en bicicleta en el Microcentro",
       subtitle = "Año 2020",
       x = "Día",
       y = "Viajes",
       caption = "Fuente: BA Data")+
  theme_minimal()

La distribución de viajes por día marca un claro contraste entre los días de semana y los fin de semanas. Es en los primeros donde se observa un mayor nivel de viajes, a un volumen similar en cada uno de los 5 días.

Repitamos el mismo análisis, pero por horas.

ggplot(bicis_2020)+
  geom_bar(aes(x = hora), fill="orange", alpha=.5, color="black") +
  scale_x_continuous(limit = c(-1, 24), breaks = seq(0, 23, 1))+
  labs(title = "Cantidad de viajes en bicicleta en el Microcentro",
       subtitle = "Año 2020",
       x = "Horas",
       y = "Viajes",
       caption = "Fuente: BA Data")+
  theme_minimal()

Durante el día, el mayor volumen de viajes en bicicleta ocurre a las 12 hs. y se mantiene en niveles similares hasta las 16 hs., cuando comienza a decaer. Como contrapartida, el mínimo volumen se registra entre 3 y 4 de la mañana.

  1. Análisis Espacial: Analizar la distribución espacial de los datos a partir de al menos 1 mapa de densidad que muestre donde se concentran la mayor cantidad de observaciones. Comparar la densidad de los datos en el tiempo (facetar). ¿Los patrones espaciales de los datos elegidos se mantienen o varían en el tiempo?

Ahora veamos las estaciones de bicicleta que más fueron utilizadas en el microcentro durante los meses de la pandemia.

ggmap(mapamicrocentro) +
  geom_sf(data=microcentro, aes(fill=MANZANA), fill="gray", alpha=.5, show.legend = FALSE, inherit.aes = FALSE)+
  stat_density_2d(data = bicis_2020, 
                  aes(x = lon, y = lat, 
                      fill = stat(level)), alpha = 0.6, geom = "polygon", contour = TRUE) +
  labs(title="Estaciones de ecobicis en el microcentro",
       subtitle="Año 2020",
       caption= "Fuente: BA Data",
       fill="Cantidad de usos")+
  theme_void()+
  scale_fill_viridis_c(option="magma", direction=-1, alpha=.6)+
  theme(plot.title = element_text(hjust = 0.2),
        plot.subtitle = element_text(size = 11, hjust = 0.1),
        legend.title = element_text(size=9))
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.

El gráfico muestra que durante el 2020 se utilizaron más las estaciones de ecobicis del lado oeste de la Av. 9 de Julio que en la city porteña (algo que a simple vista se correlaciona con los usos de suelos algo direfentes entre ambos sectores del Microcentro). En ese sentido, es particularmente notable la importancia de la estación de Congreso.

Cabe descatar que no se genera un mapa de calor uniforme que cubra toda la superficie porque el agrupamiento de datos puntuales se da pares de coordenadas distantes entre sí (correspondientes a las estaciones).

Ahora veamos como fue la intensidad de usos a lo largo de los meses.

ggmap(mapamicrocentro) +
  geom_bin2d(data = bicis_2020, aes(x = lon, y = lat), bins=7, alpha=.7)+
  scale_fill_viridis_c()+  
  labs(title="Estaciones de ecobicis en el microcentro",
       subtitle="Año 2020",
       caption= "Fuente: BA Data",
       fill="Cantidad de usos")+
  facet_wrap(~mes)+
  theme_void()+ 
  theme(plot.title = element_text(hjust = 0.1),
        plot.subtitle = element_text(size = 11, hjust = 0.05),
        legend.title = element_text(size=9))

Al desagregar los datos por mes, notamos que la alta frecuencia de usos de bicis en la estación de Congreso se corresponden principalmente con el mes de Noviembre, momento en el cual se produjeron el mayor uso de las estaciones de ecobicis en el Microcentro.

A su vez, resulta interesante observar como, a medida que los contagios retroceden, las restricciones disminuyen y la actividad aumenta, incrementa el uso de las estaciones de ecobicis. Sin embargo, se muestra un claro clivaje entre las estaciones al oeste de la Av. 9 de Julio y las de la city porteña. Mientras que las primeras muestran un incremento paulatino en la actividad a través de los meses, las segundas parecen mantener un grado de actividad (bajo) a lo largo de todo año.

En este marco, la provisión de nuevos espacios verdes en el microcentro porteño puede resultar en un foco de atracción para las personas y traer mayor dinamismo al área deprimida.